﻿using System;
using System.Text.RegularExpressions;

namespace Grishko.DataTier.SqlLibrary
{
    public class ExpressionChecker
    {
        private static bool MatchIsStatement(string statment, MatchCollection matches)
        {
            bool result = false;

            if (matches.Count == 1)
            {
                Match nextMatch = matches[0];
                string stringMatch = nextMatch.ToString();

                if (stringMatch.Length == statment.Length)
                    return true;
                else
                    return false;
            }
            return result;
        }

        public static bool MatchStatment(string statment)
        {
            // параметр=[!]значение1,...,[!]значениеN
            //  параметр        -> \b[a-zA-Zа-яА-Я]+
            //  [!]значение1    -> (!?\w)+
            //  ,[!]значениеN   -> (,!?\w+)*
            string pattern1 = @"\b[a-zA-Zа-яА-Я]+=(!?\w)+(,!?\w+)*";

            // [!]значение1,...,[!]значениеN
            //  параметр        -> \b[a-zA-Zа-яА-Я]+
            //  [!]значение1    -> (!?\w)+
            //  ,[!]значениеN   -> (,!?\w+)*
            string pattern2 = @"(!?\w)+(,!?\w+)*";


            // параметр>значение 
            // параметр<значение
            //      значением может являться только число или дата 

            // значением - только число
            string pattern3 = @"\b[a-zA-Zа-яА-Я]+[\<\>]\d+";

            // значением - только дата
            //  Дата - формат дд мм гггг
            //       - разделитель '.' '/' '-' 
            string pattern4 = @"\b[a-zA-Zа-яА-Я]+[\<\>]\d{1,2}[-\.\/]\d{1,2}[-\.\/]\d{2,4}";

            MatchCollection result1 = Regex.Matches(statment, pattern1, RegexOptions.IgnoreCase);
            MatchCollection result2 = Regex.Matches(statment, pattern2, RegexOptions.IgnoreCase);
            MatchCollection result3 = Regex.Matches(statment, pattern3, RegexOptions.IgnoreCase);
            MatchCollection result4 = Regex.Matches(statment, pattern4, RegexOptions.IgnoreCase);

            if (MatchIsStatement(statment, result1))
                return true;
            else if (MatchIsStatement(statment, result2))
                return true;
            else if (MatchIsStatement(statment, result3))
                return true;
            else if (MatchIsStatement(statment, result4))
                return true;

            return false;
        }

        public static bool CheckStatment(ref string statment, ref int ErrPartIndex)
        {
            bool result = true;

            statment = statment.Trim();
            string[] arrStatement = statment.Split(' ');
            string tmp = string.Empty;
            System.Text.StringBuilder storage = new System.Text.StringBuilder();

            ErrPartIndex = -1;

            for (int i = 0; i < arrStatement.Length; i++)
            {
                if (string.Empty == arrStatement[i]) continue;

                if (!MatchStatment(arrStatement[i]))
                {
                    ErrPartIndex = i;
                    return false;
                }
                storage.Append(" ").Append(arrStatement[i]);
            }

            statment = storage.ToString();
            statment = statment.TrimStart();
            return result;
        }
    };

}